//
//  ViewController.m
//  定时器
//
//  Created by apple on 15/8/28.
//  Copyright (c) 2015年 戴维营. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

{
    dispatch_source_t timer;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
//    定时器   （NSTimer） NSTimer精度较低，大概在50～100ms，并且会被其他任务影响到，并不会保证每次都会精确的触发；
//    在预设的时间过后执行一个动作或者是每隔多久执行一次动作；
    
//    1、先创建一个定时器，并启动；
    
//    前面这个数字为时间间隔，后面的@selector里面指的是执行的动作；

#if 0
    
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(didTimer:) userInfo:nil repeats:YES];
#endif
    
//    NSTimer会Target对象产生强引用，知道定时器停止；
    
//    -----------------------------------------------------------
#if 0   //这种方法基本上跟上面那种方法没什么分别，为什么还要引进一个NSRunLoop;?    --->(上面的那种方法只不过是下面方法的封装)；
    
//   创建定时器，但是不启动；timer开头；
    NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(didTimer:) userInfo:nil repeats:YES];
    
//    监听定时器（启动）；
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
//    useinfo参数会设置给定时器的useinfo属性;
#endif
    
#if 0
//   1、创建定时器，但是不启动；
    NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(didTimer:) userInfo:nil repeats:YES];
//   2、10s后触发；
    [timer setFireDate:[NSDate dateWithTimeIntervalSinceNow:5]];
    
//   3、监听定时器（启动）；
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
#endif
    
    
//    获取一个与屏幕刷新率绑定的定时器，ios默认为每秒为60帧；
#if 0
//    创建一个CADisplayLink定时器；
    CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(didTimer:)];
    
//    设置触发时间间隔， -->每10帧触发一次；  （时间间隔 ＝ framinterval／频率）；
    displayLink.frameInterval = 120;
//    启动；
    [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    
//    停止监听，不在触发；
    [displayLink  removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    
    
//    [CADisplayLink的触发时间与屏幕的刷新有关，默认刷新频率为1/60秒，比较精确。CPU忙碌时有可能降低刷新率，并且会跳过一些触发。一般用于刷新界面的操作，在动画和游戏中使用较多]。
#endif
    
    
//    点定时器 （GCD）;
    
#if 0
//    10秒后执行，第二个参数单位为纳秒；
//    NSEC_PER_SEC: 纳秒每秒；
    
    
//    只执行一次，
    dispatch_time_t ti = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
    
    dispatch_after(ti,dispatch_get_main_queue() , ^{
        NSLog(@"10秒后");
    });
    
#endif

//    －－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
#if 1
//     创建定时器      dispatch_source_t timer  为计算机语言底层c，为一局部变量；需要再interface里面声明；
    timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
    
//    设置定时器，每隔一秒触发，总共100秒
    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 100 * NSEC_PER_SEC);
    
    dispatch_source_set_event_handler(timer, ^{
        NSLog(@"hi");
    });
    dispatch_resume(timer);
#endif
// －－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
    
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didTimer:(NSTimer *)timer
{
    NSLog(@"草");
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
